package plp.expressions1.expression;

import plp.expressions1.util.Tipo;
import plp.expressions1.util.TipoPrimitivo;

/**
 * Um objeto desta classe representa uma  ">".
 */
public class ExpMaiorQue extends ExpBinaria {

	/**
	 * @param esq Expressao da esquerda
	 * @param dir Expressao da direita
	 */
	public ExpMaiorQue(Expressao esq, Expressao dir){
		super(esq, dir, ">");
	}


	/**
	 * Retorna o valor da Expressao de disjuncao logica
	 */
	public Valor avaliar(){
		if (getEsq().getTipo().eReal()) {
			return new ValorBooleano(((ValorReal)getEsq().avaliar()).valor() >
					((ValorReal)getDir().avaliar()).valor() );
		}else if(getEsq().getTipo().eInteiro()){
			return new ValorBooleano(((ValorInteiro)getEsq().avaliar()).valor() >
					((ValorInteiro)getDir().avaliar()).valor() );
		}
		
		return null;

	}

	/**
	 * Realiza a verificacao de tipos desta expressao.
	 *
	 * @return <code>true</code> se os tipos da expressao sao validos;
	 *          <code>false</code> caso contrario.
	 */
	protected boolean checaTipoElementoTerminal() {
		if (getEsq().getTipo().eReal()) {
			return (getEsq().getTipo().eReal() && getDir().getTipo().eReal());
		}else if(getEsq().getTipo().eInteiro()){
			return (getEsq().getTipo().eInteiro() && getDir().getTipo().eInteiro());
		}
		
		return false;
	}

	/**
	 * Retorna os tipos possiveis desta expressao.
	 *
	 * @return os tipos possiveis desta expressao.
	 */
	public Tipo getTipo() {
		return TipoPrimitivo.BOOLEANO;
	}

}
